package com.pe.regope.negocio.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.security.GrantedAuthority;
import org.springframework.security.GrantedAuthorityImpl;
import org.springframework.security.userdetails.User;
import org.springframework.stereotype.Service;

import com.pe.regope.integracion.dao.PerfilDAO;
import com.pe.regope.integracion.dao.UsuarioDAO;
import com.pe.regope.negocio.dto.PerfilDTO;
import com.pe.regope.negocio.dto.UsuarioDTO;
import com.pe.regope.negocio.service.UserManagerService;

@Service
public class UserManagerServiceImpl implements UserManagerService {

	static final String ROL_REGISTRADOR="ROLE_REGISTRADOR";
	static final String ROL_VISUALIZADOR="ROLE_VISUALIZADOR";
	static final String ROL_ASISTENTE_REPORTES="ROLE_ASISTENTE_REPORTES";
	static final String DIRECCION_MENU_ROL_REGISTRADOR="/common/menuRolRegistrador.xhtml";
	static final String DIRECCION_MENU_ROL_VISUALIZADOR="/common/menuRolVisualizador.xhtml";
	static final String DIRECCION_MENU_ROL_ASISTENTE_REPORTES="/common/menuRolAsistenteReportes.xhtml";

	@Resource
	PerfilDAO perfilDAO;
	@Resource
	UsuarioDAO usuarioDAO;

	public User getUser(String usuario, String contrasenia){
		try {		
			String perfil=usuario.substring(usuario.indexOf(" "),usuario.length());
			int intPerfil=Integer.parseInt(perfil.trim());
			usuario=usuario.substring(0, usuario.indexOf(" "));
			GrantedAuthority[] grantedAuthorities;		
			GrantedAuthority authority ;
			User user=null;
			List<PerfilDTO> listaPerfiles=perfilDAO.obtenerPerfilesUsuarioXSesion(usuario, contrasenia);
			grantedAuthorities = new GrantedAuthority[1];
			String perfilUsuario=null;
			for(int i=0;i<listaPerfiles.size();i++){
				perfilUsuario=null;
				if(listaPerfiles.get(i).getIdPerfil()==1 && intPerfil==1){
					perfilUsuario=ROL_REGISTRADOR;
				}
				if(listaPerfiles.get(i).getIdPerfil()==2 && intPerfil==2){
					perfilUsuario=ROL_VISUALIZADOR;
				}
				if(listaPerfiles.get(i).getIdPerfil()==3 && intPerfil==3){
					perfilUsuario=ROL_ASISTENTE_REPORTES;
				}
				if(perfilUsuario!=null)
				{	
					authority = new GrantedAuthorityImpl(perfilUsuario);
					grantedAuthorities[0] = authority;
				}
			}
			if(grantedAuthorities[0]!=null)
				user=new User(usuario,contrasenia,true, true,true, true, grantedAuthorities);
			else
			{
				authority = new GrantedAuthorityImpl("IS_AUTHENTICATED_ANONYMOUSLY");
				grantedAuthorities[0] = authority;
				user=new User(usuario,contrasenia,false, true,true,false, grantedAuthorities);	
			}
			return user;
		}
		catch (Exception e){
			e.printStackTrace();
			return null;
		}
	}

	public UsuarioDTO getUsuarioIniciado(String usuario, String contrasenia, Integer perfil){
		UsuarioDTO usuarioIniciado;
		usuarioIniciado=usuarioDAO.validarUsuarioInicioSesion(usuario, contrasenia, perfil);
		return usuarioIniciado;
	}

	@Override
	public String getPerfilUsuario(String usuario, String contrasenia, Integer perfil){
		PerfilDTO perfilSeleccionado=perfilDAO.obtenerPerfilUsuarioXSesion(usuario, contrasenia, perfil);
		String perfilUsuario;
		switch (perfilSeleccionado.getIdPerfil()){
			case 1:	perfilUsuario=ROL_REGISTRADOR;
			break;
			case 2:	perfilUsuario=ROL_VISUALIZADOR;
			break;
			case 3:	perfilUsuario=ROL_ASISTENTE_REPORTES;
			break;
			default:perfilUsuario="";
		}
		return perfilUsuario;
	}

	public String getDireccionMenu(String perfilUsuario) {
		String dirMenu="";
		if(perfilUsuario.equals(ROL_REGISTRADOR))
			dirMenu=DIRECCION_MENU_ROL_REGISTRADOR;
		else if(perfilUsuario.equals(ROL_VISUALIZADOR))
			dirMenu=DIRECCION_MENU_ROL_VISUALIZADOR;
		else if(perfilUsuario.equals(ROL_ASISTENTE_REPORTES))
			dirMenu=DIRECCION_MENU_ROL_ASISTENTE_REPORTES;
		return dirMenu;
	}
}
